package DataAccess;

import DataAccess.entity.Criteria;
import DataAccess.entity.DateCriteria;
import DataAccess.entity.ListProperty;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;


//<p>Classe per collegare i dati degli oggetti di dominio ai campi nelle colonne del db (Metadata Mapping)</p>

/**
 * Classe che contiene il codice SQL.
 */
public class QueryDatabase {
    
    /**
     * Query per l'inserimento nel DB dei dati di Report
     * @param val Dati di Report
     * @return Stringa contenente il codice SQL
     */
    public static String insertReport(HashMap val){
        
        String query= "INSERT INTO report(SourcePath,SourceName,SourceType,SourceAnn,DestPath,DestName,DestType,Entity,Metodo,Package,DestAnn) "+
                " VALUES ( "+
                "'"+val.get("DestName")+"',"+
                "'"+val.get("DestType")+"',"+
                "'"+val.get("Entity")+"',"+
                "'"+val.get("Metodo")+"',"+
                "'"+val.get("Package")+"',"+
                "'"+val.get("DestAnn")+"');";
        return query;
    }
    
    /**
     * Salva nel DB una Entity
     * @param val Dati della Entity
     * @return Stringa contenente il codice SQL
     */
    public static String insertEntity(HashMap val){
        
        String query= "INSERT INTO entity ( PackageName, ClassName, PropertyName, PropertyType, Annotation )"+
                " VALUES ( "+
                "'"+val.get("PackageName")+"',"+
                "'"+val.get("ClassName")+"',"+
                "'"+val.get("PropertyName")+"',"+
                "'"+val.get("PropertyType")+"',"+
                "'"+val.get("Annotation")+"');";
        return query;
    }

    static String ricercaListaClienti() {
        return "SELECT idClienteFornitore, "
                + "denominazione,"
                + "categoria, "
                + "CONCAT(nomeTitolare, ' ', cognomeTitolare) as Titolare,"
                + "partitaIVA, "
                + "codiceFiscale, "
                + "telefono,"
                + "email,"
                + "note FROM ClienteFornitore WHERE clienteFornitore = 'cliente';";
 
        
        /*
        `idClienteFornitore` int(11) NOT NULL,
  `indirizzoFiscale` int(11) DEFAULT NULL,
  `indirizzoAttuale` int(11) DEFAULT NULL,
  `indirizzoTitolare` int(11) DEFAULT NULL,
  `partitaIVA` varchar(11) NOT NULL,
  `codiceFiscale` varchar(16) DEFAULT NULL,
  `categoria` varchar(45) DEFAULT NULL,
  `denominazione` varchar(100) DEFAULT NULL,
  `nomeTitolare` varchar(45) DEFAULT NULL,
  `cognomeTitolare` varchar(45) DEFAULT NULL,
  `dataNascita` date DEFAULT NULL,
  `sesso` varchar(45) DEFAULT NULL,
  `numeroDoc` varchar(45) DEFAULT NULL,
  `cittaDoc` varchar(45) DEFAULT NULL,
  `tipoDoc` varchar(45) DEFAULT NULL,
  `provinciaDoc` varchar(45) DEFAULT NULL,
  `dataDoc` date DEFAULT NULL,
  `verificaCodiceFiscale` varchar(45) DEFAULT NULL,
  `telefono` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `note` varchar(150) DEFAULT NULL,
  `clienteFornitore` varchar(45) NOT NULL,
  * 
  */
    }
    static String ricercaListaClienti(ArrayList<Criteria> listaCriteri) {
        String where = generaWhere(listaCriteri);
        return "SELECT DISTINCT Clientefornitore.idClientefornitore as 'idClientefornitore', "
                + "Clientefornitore.denominazione as 'Denominazione', "
                + "Clientefornitore.categoria as 'Categoria', "
                + "CONCAT(Clientefornitore.nomeTitolare, ' ', Clientefornitore.cognomeTitolare) as 'Titolare', "
                + "Clientefornitore.partitaIVA as 'Partita IVA', "
                + "Clientefornitore.codiceFiscale as 'Codice Fiscale', "
                + "Clientefornitore.telefono as 'Telefono', "
                + "Clientefornitore.email as 'Email', "
                + "Clientefornitore.note as 'Note' "
                + "FROM Clientefornitore, "
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoFiscale = Indirizzo.idIndirizzo) as indFiscale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoAttuale = Indirizzo.idIndirizzo) as indAttuale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoTitolare = Indirizzo.idIndirizzo) as indTitolare "
                + " WHERE Clientefornitore.clientefornitore = 'cliente'"
                + where;
                
    }
    private static String generaWhere(ArrayList<Criteria> listaCriteri) {
        String query = "";
        for (int i = 0; i < listaCriteri.size(); i++) {
            query = query + " AND ";
            Criteria c = listaCriteri.get(i);
            query = query + " " + c.getProperty().getFieldName();
                    
            if (c.getProperty().getFieldType().equals("LIST")) {
                String condizione = c.getCondizione();
                switch (condizione) {
                    case Criteria.LIST_UGUALE: {
                        query = query + " = " + "'" + c.getValore() + "'";
                    }
                    case Criteria.LIST_DIVERSO: {
                        query = query + " != " + "'" + c.getValore() + "'";
                    }        
                }
            }
            if (c.getProperty().getFieldType().equals("INT")) {
                String condizione = c.getCondizione();
                switch (condizione) {
                    case Criteria.INT_UGUALE: {
                        query = query + " = " + c.getValore();
                    }
                    case Criteria.INT_DIVERSO: {
                        query = query + " != " + c.getValore();
                    }
                    case Criteria.INT_MAGGIORE: {
                        query = query + " > " + c.getValore();
                    } 
                    case Criteria.INT_MAGGIOREUGUALE: {
                        query = query + " >= " + c.getValore();
                    }
                    case Criteria.INT_MINORE: {
                        query = query + " < " + c.getValore();
                    }   
                    case Criteria.INT_MINOREUGUALE: {
                        query = query + " <= " + c.getValore();
                    }
                }
            }
            if (c.getProperty().getFieldType().equals("VARCHAR")) {
                String condizione = c.getCondizione();
                switch (condizione) {
                    case Criteria.VARCHAR_UGUALE: {
                        query = query + " = " + "'" + c.getValore() + "'";
                    }
                    case Criteria.VARCHAR_DIVERSO: {
                        query = query + " != " + "'" + c.getValore() + "'";
                    }
                    case Criteria.VARCHAR_CONTIENE: {
                        query = query + " LIKE " + "'%" + c.getValore() + "%'";
                    }
                    case Criteria.VARCHAR_NONCONTIENE: {
                        query = query + " NOT LIKE " + "'%" + c.getValore() + "%'";
                    }
                }
            }
            if (c.getProperty().getFieldType().equals("DATE")) {
                String condizione = c.getCondizione();
                DateCriteria dc = (DateCriteria) c;
                Date date = dc.getDate();
                SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD");
                String valore = sdf.format(date);
                switch (condizione) {
                    case Criteria.INT_UGUALE: {
                        query = query + " = " + "'" + valore + "'";
                    }
                    case Criteria.INT_DIVERSO: {
                        query = query + " != " + "'" + valore + "'";
                    }
                    case Criteria.INT_MAGGIORE: {
                        query = query + " > " + "'" + valore + "'";
                    } 
                    case Criteria.INT_MAGGIOREUGUALE: {
                        query = query + " >= " + "'" + valore + "'";
                    }
                    case Criteria.INT_MINORE: {
                        query = query + " < " + "'" + valore + "'";
                    }   
                    case Criteria.INT_MINOREUGUALE: {
                        query = query + " <= " + "'" + valore + "'";
                    }
                }
            }
            
        }
        if (query.isEmpty()) {
            query = query + ";";
        }
       
        return query;
    }
    static String ricercaClienteFornitore(int indice) {
        String query = "";
        query = "SELECT Clientefornitore.idClientefornitore as idClientefornitore, "
                + "Clientefornitore.codiceFiscale as codiceFiscale, "
                + "Clientefornitore.partitaIVA as partitaIVA, "
                + "Clientefornitore.categoria as categoria, "
                + "Clientefornitore.denominazione as denominazione, "
                + "CONCAT(indFiscale.via, ' n.', indFiscale.numeroCivico) as viaFiscale, "
                + "indFiscale.citta as cittaFiscale, "
                + "indFiscale.cap as capFiscale, "
                + "indFiscale.provincia as provinciaFiscale, "
                + "CONCAT(indAttuale.via, ' n.', indAttuale.numeroCivico) as viaAttuale, "
                + "indAttuale.citta as cittaAttuale, "
                + "indAttuale.cap as capAttuale, "
                + "indAttuale.provincia as provinciaAttuale, "
                + "CONCAT(indTitolare.via, ' n.', indTitolare.numeroCivico) as viaTitolare, "
                + "indTitolare.citta as cittaTitolare, "
                + "indTitolare.cap as capTitolare, "
                + "indTitolare.provincia as provinciaTitolare, "
                + "Clientefornitore.dataNascita as dataNascita, "
                + "CONCAT(Clientefornitore.nomeTitolare, ' ', Clientefornitore.cognomeTitolare) as nomecognomeTitolare, "
                + "Clientefornitore.sesso as sesso, "
                + "Clientefornitore.cittaDoc as cittaDoc, "
                + "Clientefornitore.numeroDoc as numeroDoc, "
                + "Clientefornitore.note as note, "
                + "Clientefornitore.telefono as telefono, "
                + "Clientefornitore.tipoDoc as tipoDoc, "
                + "Clientefornitore.provinciaDoc as provinciaDoc, "
                + "Clientefornitore.dataDoc as dataDoc, "
                + "Clientefornitore.data as data, "
                + "Clientefornitore.cittaNascita as cittaNascita, "
                + "Clientefornitore.email as email, "
                + "Clientefornitore.verificaCodiceFiscale as verificaCodiceFiscale, "
                + "Clientefornitore.clientefornitore as Cliente_Fornitore "
                + "FROM Clientefornitore, "
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.idClientefornitore = " + indice + " AND Clientefornitore.indirizzoFiscale = Indirizzo.idIndirizzo) as indFiscale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.idClientefornitore = " + indice + " AND Clientefornitore.indirizzoAttuale = Indirizzo.idIndirizzo) as indAttuale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.idClientefornitore = " + indice + " AND Clientefornitore.indirizzoTitolare = Indirizzo.idIndirizzo) as indTitolare "
                + "WHERE Clientefornitore.idClienteFornitore = " + indice + ";";
        return query;
    }
    static String ricercaCampiClienteFornitore(String c_f) {
        String query = "";
        query = "SELECT Clientefornitore.idClientefornitore as idClientefornitore, "
                + "Clientefornitore.codiceFiscale as 'Codice Fiscale', "
                + "Clientefornitore.partitaIVA as 'Partita IVA', "
                + "Clientefornitore.categoria as 'Categoria', "
                + "Clientefornitore.denominazione as Denominazione, "
                //+ "CONCAT(indFiscale.via, ' n.', indFiscale.numeroCivico) as viaFiscale, "
                + "indFiscale.citta as 'Città Fiscale', "
                //+ "indFiscale.cap as capFiscale, "
                + "indFiscale.provincia as 'Provincia Fiscale', "
                //+ "CONCAT(indAttuale.via, ' n.', indAttuale.numeroCivico) as viaAttuale, "
                + "indAttuale.citta as 'Città Attuale', "
                //+ "indAttuale.cap as capAttuale, "
                + "indAttuale.provincia as 'Provincia Attuale', "
                //+ "CONCAT(indTitolare.via, ' n.', indTitolare.numeroCivico) as viaTitolare, "
                + "indTitolare.citta as 'Città Titolare', "
                //+ "indTitolare.cap as capTitolare, "
                + "indTitolare.provincia as 'Provincia Titolare', "
                //+ "Clientefornitore.dataNascita as dataNascita, "
                + "CONCAT(Clientefornitore.nomeTitolare, ' ', Clientefornitore.cognomeTitolare) as 'Nome e Cognome Titolare', "
                //+ "Clientefornitore.sesso as sesso, "
                //+ "Clientefornitore.cittaDoc as cittaDoc, "
                //+ "Clientefornitore.numeroDoc as numeroDoc, "
                + "Clientefornitore.note as 'Note', "
                //+ "Clientefornitore.telefono as telefono, "
                //+ "Clientefornitore.tipoDoc as tipoDoc, "
                //+ "Clientefornitore.provinciaDoc as provinciaDoc, "
                //+ "Clientefornitore.dataDoc as dataDoc, "
                + "Clientefornitore.data as 'Data', "
                //+ "Clientefornitore.cittaNascita as cittaNascita, "
                + "Clientefornitore.email as 'email' "
                //+ "Clientefornitore.verificaCodiceFiscale as verificaCodiceFiscale, "
                //+ "Clientefornitore.clientefornitore as Cliente_Fornitore "
                + "FROM Clientefornitore, "
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoFiscale = Indirizzo.idIndirizzo) as indFiscale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoAttuale = Indirizzo.idIndirizzo) as indAttuale,"
                + "(SELECT * From Indirizzo, Clientefornitore WHERE Clientefornitore.indirizzoTitolare = Indirizzo.idIndirizzo) as indTitolare "
                + " WHERE Clientefornitore.clientefornitore = '" + c_f +"';";
        return query;
    }
    static String ricercaListaFornitori() {
        return "SELECT idClienteFornitore, "
                + "denominazione,"
                + "categoria, "
                + "CONCAT(nomeTitolare, ' ', cognomeTitolare) as Titolare,"
                + "partitaIVA, "
                + "codiceFiscale, "
                + "telefono,"
                + "email,"
                + "note FROM ClienteFornitore WHERE clienteFornitore = 'fornitori';";
    }

    static String ricercaListaOrdiniclienti() {
        return "SELECT idOrdinecliente, "
                + "nFattura as 'Numero Fattura', "
                + "denominazione as Cliente, "
                + "Ordinecliente.data as Data, "
                + "pagamento as Pagamento, "
                + "TotaleFattura as Totale "
                + "FROM Ordinecliente, ClienteFornitore WHERE Ordinecliente.cliente = ClienteFornitore.idClienteFornitore AND clienteFornitore = 'cliente';";
    }

    static String ottieniNuovo_nFattura() {
        return "SELECT MAX(nFattura) as 'nuovo' FROM Ordinecliente WHERE YEAR(CURDATE()) = YEAR(Ordinecliente.data);";
    }

    
    
   
    
    
}
